""" 用于定义图书管理系统 书架 实体"""

from pymysql import Connection
from book_define import Book


class BookShelf:
    """
    书架类，可以将数据库操作封装起来
    创建一个名为BMS的数据库，其中创建两个表：
    表1：books，用于存放书籍相关数据     在数据库中，使用false表示借出，true表示在库
    表2：loan_record,用于存放借阅记录

    注意：书架类仅可实例化一次
    书籍id为唯一区分
    """

    def __init__(self):
        # 创建数据库连接
        self.conn = Connection(
            host='localhost',
            port=3306,
            user='root',
            password='123456',
            autocommit=True
        )

        self.cursor = self.conn.cursor()    # 创建游标对象

        self.database_exists = False    # 数据库创建状态

        # 判断数据库是否存在，若是不存在则创建,存在则切换数据库
        self.cursor.execute("show databases like 'bms'")
        result = self.cursor.fetchall()
        # 根据返回值的长度进行判断,0为不存在，1为存在
        if len(result) == 1:
            self.cursor.execute("use BMS;")
            self.database_exists = True     # 对数据库状态进行标记
        else:
            # 创建数据库，创建两个表(books表 与 loan_record表 均以book_id 为主键)
            self.cursor.execute("create database BMS charset UTF8;")
            self.cursor.execute("use BMS;")
            self.cursor.execute("create table books(book_id varchar(16), \
                                            book_type varchar(12), \
                                            title varchar(20), \
                                            author varchar(20), \
                                            press varchar(20), \
                                            status varchar(10),primary key(title));")
            self.cursor.execute("create table loan_record(book_id varchar(16), title varchar(20), count int, primary key(title));")

    def init_shelf(self):
        """
        用于初始化书架，为了避免重复插入，故创建类变量database_exists用于标记数据库状态
        若为False，则代表数据库第一次创建，此时需要往数据库中插入初始值
        若为True，则表示数据库至少为创建后一回合，故不插入数据
        :return: None
        """
        if not self.database_exists:
            # 默认在书架中放置四大名著
            book1 = Book('000001', '文学经典', '三国演义', '罗贯中', '北京大学出版社', 'false')
            book2 = Book('000002', '文学经典', '西游记', '吴承恩', '人民文学出版社', 'false')
            book3 = Book('000003', '文学经典', '水浒传', '施耐庵', '人民文学出版社', 'false')
            book4 = Book('000004', '文学经典', '红楼梦', '曹雪芹', '长江文艺出版社', 'false')
            self.insert_into_books(book1)
            self.insert_into_books(book2)
            self.insert_into_books(book3)
            self.insert_into_books(book4)

    def insert_into_books(self, book: Book):
        """
        直接在books 表中插入数据
        :param book: 书 对象
        :return: None
        """
        self.cursor.execute(f"insert into books values('{book.book_id}', '{book.book_type}', '{book.title}', \
                                                        '{book.author}', '{book.press}', '{book.status}')")

    def update_into_books(self, book: Book):
        """
        以book.title为索引，在books表中，将所有数据全部更新
        :param book: 封装的更新数据
        :return: None
        """
        self.cursor.execute(f"update books set book_type='{book.book_type}', book_id='{book.book_id}', \
        author='{book.author}', press='{book.press}', status='{book.status}' where title='{book.title}'")

    def delete_into_books(self, book: Book):
        """
        以book.title为索引，在books表中，对应的数据删除
        :param book: 封装的目标数据
        :return: None
        """
        self.cursor.execute(f"delete from books where title = '{book.title}';")

    def show_books(self) -> tuple:
        """
        获取books 表中的所有数据
        :return:
        """
        self.cursor.execute("select * from books")
        return self.cursor.fetchall()

    def insert_into_loan_record(self, book: Book):
        """
        更新loan_record 表中的借阅次数，若是无记录，则插入，若是有记录，则更新
        :param book:
        :return:
        """
        self.cursor.execute(f"select book_id from loan_record")
        if self.cursor.fetchone() is None:
            self.cursor.execute(f"insert into loan_record values('{book.book_id}', '{book.title}',  1);")
        else:
            self.cursor.execute(f"update loan_record set count=count+1")

    def show_loan_record(self):
        """
        获取loan_record 表中的所有数据
        :return:
        """
        self.cursor.execute("select * from loan_record")
        return self.cursor.fetchall()


if __name__ == '__main__':
    test = BookShelf()
    book = Book('000001', '000001', 'test', 'test', 'test', 'test')
    # test.show_books()
    # test.insert_into_books(book)
    test.insert_into_books(book)